/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package be.cultuurschuur.services;

import be.cultuurschuur.Controllers.*;
import be.cultuurschuur.entity.*;
import be.cultuurschuur.interfaces.*;
import java.io.*;
import java.util.*;
import java.util.logging.*;
import javax.faces.context.*;
import javax.persistence.*;

/**
 *
 * @author Jolien
 */
public class BLReis implements ReisInterface
{
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("cultuurschuurPU");
    EntityManager em = emf.createEntityManager();
    EntityTransaction tx = em.getTransaction();
    
    private Bestemming bestemming;
    private Periode periode;
    private Vervoer vervoer;
    private int aantalPlaatsen;
    private Double prijsPerPersoon;
    private String plaatsVanVertrek;

    public Bestemming getBestemming() {
        return bestemming;
    }

    public void setBestemming(int bestemmingId)
    {
        BLBestemming blBestemming = new BLBestemming();
        this.bestemming = blBestemming.getBestemmingById(bestemmingId);
    }

    public Periode getPeriode() {
        return periode;
    }

    public void setPeriode(int periodeId)
    {
        BLPeriode blPeriode = new BLPeriode();
        this.periode = blPeriode.getPeriodeById(periodeId);
    }

    public Vervoer getVervoer() {
        return vervoer;
    }

    public void setVervoer(int vervoerId)
    {
        BLVervoer blVervoer = new BLVervoer();
        this.vervoer = blVervoer.getVervoerById(vervoerId);
    }

    public int getAantalPlaatsen() {
        return aantalPlaatsen;
    }

    public void setAantalPlaatsen(int aantalPlaatsen) {
        this.aantalPlaatsen = aantalPlaatsen;
    }

    public Double getPrijsPerPersoon() {
        return prijsPerPersoon;
    }

    public void setPrijsPerPersoon(Double prijsPerPersoon) {
        this.prijsPerPersoon = prijsPerPersoon;
    }

    public String getPlaatsVanVertrek() {
        return plaatsVanVertrek;
    }

    public void setPlaatsVanVertrek(String plaatsVanVertrek) {
        this.plaatsVanVertrek = plaatsVanVertrek;
    }

    @Override
    public Reis insertReis()
    { 
        tx.begin();
        Reis reis = new Reis();
        reis.setAantalPlaatsen(aantalPlaatsen);
        reis.setBestemming(bestemming);
        reis.setPeriode(periode);
        reis.setPlaatsVanVertrek(plaatsVanVertrek);
        reis.setPrijsPerPersoon(prijsPerPersoon);
        reis.setVervoer(vervoer);
        
        em.persist(reis);
        tx.commit();
        try {
            FacesContext.getCurrentInstance().getExternalContext().redirect("reis.xhtml");
        } catch (IOException ex) {
            Logger.getLogger(VervoerController.class.getName()).log(Level.SEVERE, null, ex);
        }
        return reis;
    }
    
    @Override
    public List<Reis> getReisen()
    {
        return em.createNamedQuery("Reis.getAll").getResultList();
    }
    
    @Override
    public Reis getReisById(int id)
    {
        Query q = em.createNamedQuery("Reis.getById");
        q.setParameter(1, id);
        Reis reis = (Reis)q.getSingleResult();
        return reis;
    }
    
    @Override
    public Reis updateReis(Reis reis)
    {
        tx.begin();

        Reis r = em.find(Reis.class, reis.getId());
        r.setAantalPlaatsen(reis.getAantalPlaatsen());
        r.setBestemming(reis.getBestemming());
        r.setPeriode(reis.getPeriode());
        r.setPlaatsVanVertrek(reis.getPlaatsVanVertrek());
        r.setPrijsPerPersoon(reis.getPrijsPerPersoon());
        r.setVervoer(reis.getVervoer());       
        
        em.persist(r);

        tx.commit();
        return r;
    }
    
    @Override
    public boolean deleteReis(int id)
    {
        try {
            tx.begin();

            Reis r = em.find(Reis.class, id);
            em.remove(r);
            tx.commit();
            return true;
        } catch (Exception exc) {
            return false;
        }
    }
    
    @Override
    public List<Integer> getPlaatsen()
    {
        return em.createNamedQuery("Reis.getAllPlaatsen").getResultList();
    }

    @Override
    public List<Reis> zoek(Bestemming bestemming, Periode periode, int plaatsen, Vervoer vervoer)
    {
        Query q;
        
        if(bestemming != null)
        {
            if(periode != null)
            {
                if(plaatsen != 0)
                {
                    if(vervoer != null)
                    {
                        q = em.createNamedQuery("Reis.getByBestemmingPeriodePlaatsenVervoer");
                        q.setParameter(1, bestemming.getId());
                        q.setParameter(2, periode.getId());
                        q.setParameter(3, plaatsen);
                        q.setParameter(4, vervoer.getId());
                    }
                    else // geen vervoer
                    {
                        q = em.createNamedQuery("Reis.getByBestemmingPeriodePlaatsen");
                        q.setParameter(1, bestemming.getId());
                        q.setParameter(2, periode.getId());
                        q.setParameter(3, plaatsen);
                    }
                }
                else //geen plaatsen
                {
                    if(vervoer != null)
                    {
                        q = em.createNamedQuery("Reis.getByBestemmingPeriodeVervoer");
                        q.setParameter(1, bestemming.getId());
                        q.setParameter(2, periode.getId());
                        q.setParameter(3, vervoer.getId());
                    }
                    else // geen vervoer
                    {
                        q = em.createNamedQuery("Reis.getByBestemmingPeriode");
                        q.setParameter(1, bestemming.getId());
                        q.setParameter(2, periode.getId());
                    }
                }
            }
            else // geen periode
            {
                if(plaatsen != 0)
                {
                    if(vervoer != null)
                    {
                        q = em.createNamedQuery("Reis.getByBestemmingPlaatsenVervoer");
                        q.setParameter(1, bestemming.getId());
                        q.setParameter(2, plaatsen);
                        q.setParameter(3, vervoer.getId());
                    }
                    else // geen vervoer
                    {
                        q = em.createNamedQuery("Reis.getByBestemmingPlaatsen");
                        q.setParameter(1, bestemming.getId());
                        q.setParameter(2, plaatsen);
                    }
                }
                else // geen plaatsen
                {
                    if(vervoer != null)
                    {
                        q = em.createNamedQuery("Reis.getByBestemmingVervoer");
                        q.setParameter(1, bestemming.getId());
                        q.setParameter(2, vervoer.getId());
                    }
                    else // geen vervoer
                    {
                        q = em.createNamedQuery("Reis.getByBestemming");
                        q.setParameter(1, bestemming.getId());
                    }
                }
            }
        }
        else // geen bestemming
        {
            if(periode != null)
            {
                if(plaatsen != 0)
                {
                    if(vervoer != null)
                    {
                        q = em.createNamedQuery("Reis.getByPeriodePlaatsenVervoer");
                        q.setParameter(1, periode.getId());
                        q.setParameter(2, plaatsen);
                        q.setParameter(3, vervoer.getId());
                    }
                    else // geen vervoer
                    {
                        q = em.createNamedQuery("Reis.getByPeriodePlaatsen");
                        q.setParameter(1, periode.getId());
                        q.setParameter(2, plaatsen);
                    }
                }
                else // geen plaatsen
                {
                    if(vervoer != null)
                    {
                        q = em.createNamedQuery("Reis.getByPeriodeVervoer");
                        q.setParameter(1, periode.getId());
                        q.setParameter(2, vervoer.getId());
                    }
                    else // geen vervoer
                    {
                        q = em.createNamedQuery("Reis.getByPeriode");
                        q.setParameter(1, periode.getId());
                    }
                }
            }
            else // geen periode
            {
                if(plaatsen != 0)
                {
                    if(vervoer != null)
                    {
                        q = em.createNamedQuery("Reis.getByPlaatsenVervoer");
                        q.setParameter(1, plaatsen);
                        q.setParameter(2, vervoer.getId());
                    }
                    else // geen vervoer
                    {
                        q = em.createNamedQuery("Reis.getByPlaatsen");
                        q.setParameter(1, plaatsen);
                    }
                }
                else // geen plaatsen
                {
                    if(vervoer != null)
                    {
                        q = em.createNamedQuery("Reis.getByVervoer");
                        q.setParameter(1, vervoer.getId());
                    }
                    else // geen vervoer
                    {
                        q = em.createNamedQuery("Reis.getAll");
                    }
                }
            }
        }
        
        List<Reis> reis = (List<Reis>) q.getResultList();

        try
        {
            FacesContext.getCurrentInstance().getExternalContext().redirect("overzicht.xhtml");
        }
        catch (IOException ex)
        {
            Logger.getLogger(VervoerController.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        return reis;
    }
    
}
